/**
 * Java基本语法教学案例
 * 本案例演示了Java程序的基本结构和语法要素
 */
public class JavaBasicSyntaxExample {
    
    // 常量定义 - 使用final关键字
    private static final String COURSE_NAME = "Java基础语法"; // 常量命名通常使用全大写和下划线
    
    // 实例变量 - 属于对象的变量
    private int studentCount;  // 学生计数器
    private String className;  // 班级名称
    
    // 静态变量 - 属于类的变量，所有实例共享
    private static int totalClasses = 0; // 班级总数计数器
    
    /*
     * main方法 - 程序的入口点
     * @param args 命令行参数
     * 难点：main方法必须是public static void，并且参数必须是String数组
     */
    public static void main(String[] args) {
        // 创建类的实例
        JavaBasicSyntaxExample example = new JavaBasicSyntaxExample();
        
        // 调用各种演示方法
        example.demonstrateIdentifiers();      // 演示标识符
        example.demonstrateDataTypes();        // 演示数据类型
        example.demonstrateVariables();        // 演示变量和常量
        example.demonstrateOperators();        // 演示运算符
    }
    
    /**
     * 演示Java标识符命名规则
     * 注意事项：
     * 1. 标识符可以包含字母、数字、下划线(_)和美元符($)
     * 2. 不能以数字开头
     * 3. 区分大小写
     * 4. 不能是Java关键字
     */
    public void demonstrateIdentifiers() {
        System.out.println("=== 标识符命名规则演示 ===");
        
        // 正确的标识符命名
        int studentAge = 20;           // 以字母开头
        int _score = 95;               // 以下划线开头
        int $price = 100;              // 以美元符开头
        int age2 = 25;                 // 包含数字但不以数字开头
        
        // 错误的标识符命名（被注释掉避免编译错误）
        // int 2age = 20;              // 错误：以数字开头
        // int class = 5;              // 错误：使用关键字
        // int my-age = 10;            // 错误：包含连字符
        
        System.out.println("合法标识符示例：studentAge=" + studentAge + 
                          ", _score=" + _score + ", $price=" + $price);
    }
    
    /**
     * 演示Java数据类型
     * Java数据类型分为基本数据类型和引用数据类型
     */
    public void demonstrateDataTypes() {
        System.out.println("\n=== 数据类型演示 ===");
        
        // 基本数据类型 - 数值类型
        byte byteValue = 127;                    // 8位有符号整数，范围-128到127
        short shortValue = 32767;                // 16位有符号整数，范围-32768到32767
        int intValue = 2147483647;               // 32位有符号整数，范围约±21亿
        long longValue = 9223372036854775807L;   // 64位有符号整数，需要L后缀
        float floatValue = 3.14f;                // 32位浮点数，需要f后缀
        double doubleValue = 3.14159;            // 64位浮点数
        
        // 基本数据类型 - 字符和布尔类型
        char charValue = 'A';                    // 16位Unicode字符
        boolean booleanValue = true;             // 布尔值，只有true和false
        
        System.out.println("数值类型：");
        System.out.println("byte: " + byteValue);
        System.out.println("short: " + shortValue);
        System.out.println("int: " + intValue);
        System.out.println("long: " + longValue);
        System.out.println("float: " + floatValue);
        System.out.println("double: " + doubleValue);
        System.out.println("字符类型：");
        System.out.println("char: " + charValue);
        System.out.println("布尔类型：");
        System.out.println("boolean: " + booleanValue);
    }
    
    /**
     * 演示变量和常量的使用
     * 变量：在程序运行过程中其值可以改变的量
     * 常量：在程序运行过程中其值不可以改变的量
     */
    public void demonstrateVariables() {
        System.out.println("\n=== 变量和常量演示 ===");
        
        // 局部变量 - 在方法内定义的变量
        int localCounter = 10;
        String message = "Hello Java!";
        
        System.out.println("课程名称（类常量）: " + COURSE_NAME);
        System.out.println("局部变量 - 计数器: " + localCounter);
        System.out.println("局部变量 - 消息: " + message);
        
        // 修改变量值
        localCounter = 20;
        message = "修改后的消息";
        
        System.out.println("修改后的计数器: " + localCounter);
        System.out.println("修改后的消息: " + message);
        
        // 实例变量的使用
        this.studentCount = 30;
        this.className = "初级Java班";
        totalClasses++; // 静态变量属于类，所有实例共享
        
        System.out.println("班级名称: " + this.className);
        System.out.println("学生人数: " + this.studentCount);
        System.out.println("总班级数: " + totalClasses);
    }
    
    /**
     * 演示Java运算符的使用
     * 包括算术运算符、比较运算符和逻辑运算符
     */
    public void demonstrateOperators() {
        System.out.println("\n=== 运算符演示 ===");
        
        int a = 10;
        int b = 5;
        
        // 算术运算符
        System.out.println("算术运算符演示：");
        System.out.println(a + " + " + b + " = " + (a + b));
        System.out.println(a + " - " + b + " = " + (a - b));
        System.out.println(a + " * " + b + " = " + (a * b));
        System.out.println(a + " / " + b + " = " + (a / b));
        System.out.println(a + " % " + b + " = " + (a % b));
        
        // 比较运算符
        System.out.println("\n比较运算符演示：");
        System.out.println(a + " > " + b + " : " + (a > b));
        System.out.println(a + " < " + b + " : " + (a < b));
        System.out.println(a + " == " + b + " : " + (a == b));
        System.out.println(a + " != " + b + " : " + (a != b));
        System.out.println(a + " >= " + b + " : " + (a >= b));
        System.out.println(a + " <= " + b + " : " + (a <= b));
        
        // 逻辑运算符
        boolean x = true;
        boolean y = false;
        
        System.out.println("\n逻辑运算符演示：");
        System.out.println(x + " && " + y + " : " + (x && y)); // 逻辑与
        System.out.println(x + " || " + y + " : " + (x || y)); // 逻辑或
        System.out.println("!" + x + " : " + (!x));            // 逻辑非
        
        // 注意事项：短路求值
        System.out.println("\n短路求值演示：");
        int num = 5;
        // 由于false && ...，右侧不会执行，避免了除零错误
        boolean result = false && (num / 0 == 0); 
        System.out.println("短路求值结果: " + result);
    }
}